/**
 * 
 */
package io;

import general.Page;
import gui.TextArea;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.CharBuffer;
import java.util.Vector;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;

import javax.swing.text.html.parser.TagElement;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.parser.Parser;
import 	org.jsoup.parser.Tag;
import org.jsoup.select.Elements;

import criteres.Criteres;

/**
 * Classe mettant a disposition un certain nombre d'outils autour du parser HTML
 * @author remi
 *@version 1.0
 */
public class OutilsParsingHTML {

	/**
	 * Constructeur classique
	 */
	public OutilsParsingHTML() {
		// TODO Auto-generated constructor stub
	}

	public static Vector<File> documentToLinks(Document document){

		Vector<File> retour = new Vector<File>();

		Elements elements = document.getElementsByTag("link");
		elements.addAll(document.getElementsByTag("a"));
		Vector<String>  resultat = new Vector<String>();
		for(Element element : elements){

			try{
				System.out.println("le passage a analyser : "+element.outerHtml());
				Pattern p1 = Pattern .compile("href=\"\\S*\"",Pattern.CASE_INSENSITIVE);
				String entree1 = element.outerHtml();

				Matcher m1 = p1.matcher(entree1);

				String string1 = "";
				while(m1.find()){
					//System.out.println("voici m1: "+m1.toString());
					string1 =  entree1.substring(m1.start(), m1.end());
				}

				System.out.println("extraction du href " + string1);

				String[] string2 = string1.split("\"");
				System.out.println("resultat du decoupage : ");
				for(String string : string2){
					System.out.print(" \\\\ "+string+" \\\\ ");	
				}
				System.out.println("");

				for(String string : string2){
					//System.out.println("string dans le tableaud estring : "+string);
					//Pattern p2 = Pattern .compile("(\\S*.html)||(\\S*.htm)");
					Pattern p2 = Pattern .compile("(\\S)*\\.htm",Pattern.CASE_INSENSITIVE);
					Matcher m2 = p2.matcher(string);
					while(m2.find()){
						if(string.substring(m2.start(), m2.end())!=""){
							System.out.println("info recupérée "+string.substring(m2.start(), m2.end()));
							resultat.add(string.substring(m2.start(), m2.end()));
						}
					}
				}


				//				Pattern p2 = Pattern.compile("(href=)\\S*");
				//				Matcher m2 = p2.matcher(string1);
				//				
				//				String string2="";
				//				while (m2.find())
				//					string2 = string1.substring(m2.start(), m2.end() );
				//					System.out.println("analyse expression reguliere 2 : " + string2 );
				//				
				//	
				//				
				//				String[] string3 = string2.split(" ", 2);
				//				System.out.println("contenu du tableau de String: "+ string3[0]);
				//				
				//				String[] string4 = string3[0].split("\".*\"");
				//				System.out.println("contenu du tableau de String 2: "+ string4[0]);



			}catch(PatternSyntaxException pse){
				System.out.println(" probleme ");
				pse.getMessage();
			}
		}

		System.out.println("voici les resultats : ");
		for(String string : resultat){
			if(string.length()!=0)
				System.out.println(string);
		}
		return retour;
	}

	public static String fileToString(File file){
		String retour = new String("");
		if(file.exists()==false){
			try {
				TextArea.ecrireMsg("attention, le fichier de conf n'est pas a sa place, qui devrait etre : "+file.getCanonicalPath());
			} catch (IOException e) {
				e.printStackTrace();

				return "";
			}
		}



		String chaine="";


		//lecture du fichier texte	
		try{
			InputStream ips=new FileInputStream(file); 
			InputStreamReader ipsr=new InputStreamReader(ips);
			BufferedReader br=new BufferedReader(ipsr);
			String ligne;
			while ((ligne=br.readLine())!=null){

				chaine+=ligne+"\n";
			}
			br.close(); 
		}		
		catch (Exception e){
			System.out.println(e.toString());
		}


		retour = chaine;
		System.out.println("contenu de retour : "+retour);
		return retour;
	}

	public static Vector<Element> configFileToTags(File file){

		Vector<Element> lesElements = new Vector<Element>();

		//lire le fichier ligne a ligne, extraire les infos au fur et a mesure

		String chaine="";


		//lecture du fichier texte	
		try{
			InputStream ips=new FileInputStream(file); 
			InputStreamReader ipsr=new InputStreamReader(ips);
			BufferedReader br=new BufferedReader(ipsr);
			String ligne;
			while ((ligne=br.readLine())!=null){

				//enlever le < et le >
				//enlever le premier caractere
				ligne = ligne.replace("<","");
				ligne = ligne.replace(">","");

				//	System.out.println(ligne);

				//creer un nouvel element correpsondant a la balise
				lesElements.add(new Element( Tag.valueOf(ligne), ""));


				chaine+=ligne+"\n";
			}
			br.close(); 
		}		
		catch (Exception e){
			System.out.println(e.toString());
		}



		return lesElements;

	}

	/**
	 * fonction creant un document html a partir d'un fichier
	 * @param file le fichier html a treaiter
	 * @return le document
	 */
	public static Document fileToDocument(File file){

		Document docLocal=null;
		try {//on parse le fichier html correspondant à la page
			docLocal = Jsoup.parse(file,"UTF-8");
			System.out.println("parsing réussi");


		} catch (IOException e) {
			System.err.println("probleme lors du parsing d'une page html, le chemin du fichier n'est pas le bon");
			docLocal =new Document("");
			e.printStackTrace();
		}


		return docLocal;

	}

	public static Document fileToTags(File file,Vector<Element> lesElements){

		Document documentLocale = null;

		try {//on parse le fichier html correspondant à la page
			documentLocale = Jsoup.parse(file,"UTF-8");
			System.out.println("parsing réussi");

		} catch (IOException e) {
			System.err.println("probleme lors du parsing d'une page html, le chemin du fichier n'est pas le bon");
			documentLocale =new Document("");
			e.printStackTrace();
		}



		//on va lancer une fonction recursive pour recuperer tous les elements du document
		for(Element element : documentLocale.getAllElements()){
			parcoursElements(lesElements, element);
		}

		//		System.out.println("test du contenu du document\n");
		//		for(Element elementdoc : documentLocale.getAllElements()){
		//			System.out.println("element "+elementdoc.tagName());
		//		}


		return documentLocale;

	}


	public static Vector<Element> fileToTags(File file,Document documentLocale){

		try {//on parse le fichier html correspondant à la page
			documentLocale = Jsoup.parse(file,"UTF-8");
			System.out.println("parsing réussi");

		} catch (IOException e) {
			System.err.println("probleme lors du parsing d'une page html, le chemin du fichier n'est pas le bon");
			documentLocale =new Document("");
			e.printStackTrace();
		}


		//on va lancer une fonction recursive pour recuperer tous les elements du document
		Vector<Element> lesElements  = new Vector<Element>();

		for(Element element : documentLocale.getAllElements()){
			parcoursElements(lesElements, element);
		}




		return lesElements;

	}


	public static Vector<Element> fileToTags(File file){

		Document document;
		try {//on parse le fichier html correspondant à la page
			document = Jsoup.parse(file,"UTF-8");
		} catch (IOException e) {
			System.err.println("probleme lors du parsing d'une page html, le chemin du fichier n'est pas le bon");
			document =null;
			e.printStackTrace();
		}

		//on va lancer une fonction recursive pour recuperer tous les elements du document
		Vector<Element> lesElements  = new Vector<Element>();

		for(Element element : document.getAllElements()){
			parcoursElements(lesElements, element);
		}

		return lesElements;

	}

	public static Vector<Element> pageToTags(Page page){

		System.out.println("test de la lib externe d'utilisation de balise\n");

		Vector<Element> lesElements= new Vector<Element>();
		lesElements = fileToTags(page.getFichier());

		return lesElements;
	}

	public static void parcoursElements(Vector<Element> vecteurElementIn, Element elementDeDepart){
		//System.err.println("lancement de la fonction de parcours, le vecteur resultat est de taille  : "+vecteurElementIn.size());
		vecteurElementIn.add(elementDeDepart);
		if(elementDeDepart.getAllElements().size()>0){
			//			for(Element element : elementDeDepart.getAllElements()){
			for(Element element : elementDeDepart.children()){
				parcoursElements(vecteurElementIn, element);
			}
		}
	}

	//	public static void main(String[] args) {
	//
	//
	//		// TODO LectureFichhierHTML main : a remplir
	//		File repertoire = new File("inputHTML/test_tag"); 
	//		Vector<Page> pages = new Vector<Page>();
	//		ImporterFichierHTML.creerPagesAPartirDunRepertoire(repertoire, pages);
	//
	//		Vector<Element> vecteurElement = new Vector<Element>();
	//		vecteurElement = pageToTags(pages.get(0));
	//
	//		System.out.println("les tages dans le document");
	//		for(int i =0;i< vecteurElement.size();i++){
	//			System.out.println("element : "+ vecteurElement.get(i).tagName());
	//			System.out.println("contenu : "+vecteurElement.get(i).text());
	//		}
	//
	//		System.err.println("\n\n\n");
	//		for(int i=0;i<pages.size();i++){
	//			System.err.println("voici le chemin de la page : " + pages.get(i).getUrlLocal());
	//		}
	//	}


	public static void main(String[] args) {

		File repertoire = new File("inputHTML/test_tag"); 
		Vector<Page> pages = new Vector<Page>();
		ImporterFichierHTML.creerPagesAPartirDunRepertoire(repertoire, pages);

		for(Page page : pages){
			Vector<Element> lesElements = new Vector<Element>(); 
			Document document = OutilsParsingHTML.fileToTags(page.getFichier(),lesElements);

			Vector<File> fichierLinks = documentToLinks(document);


		}

	}
}
